package com.learning.spring.aop.aspectj.pointcut.expression.function;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

/**
 * ClassName: TargetPointcutFunction
 * Description: 目标类切点函数：within、@target、@within、target
 * Date: 2020/10/15 10:25 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
@Aspect
public class TargetPointcutFunction {


    /**
     * within 函数：通过类匹配模式串，针对目标类而言，不是运行期对象的类型。指定的最小范围是类。
     * <p>
     * within(com.learning.spring.aop.aspectj.AopService) 不会匹配任何方法。AopService 是接口，没有实例。
     * within(com.learning.spring.aop.aspectj.AopServiceImpl) 匹配类方法
     * <p>
     * within(com.learning.spring.aop.*) 匹配 com.learning.spring.aop 中的所有类，不包括子类
     * within(com.learning.spring.aop..*) 匹配 com.learning.spring.aop 中的所有类，包括子类
     */
    @Before("within(com.learning.spring.aop.aspectj.pointcut.expression.service.impl.AopServiceImpl)")
    public void within() {
        System.out.println("Hello within Function");
    }


    /**
     * 除了 @annotation、@args，函数 @target、@within 也是作用域注解的切点函数
     * 1. 函数 @target(A)：匹配任意标注了注解 @A 的目标类
     * 2. 在 AopServiceImpl 目标类上标注 @LogEntity
     */
    @Before("@target(com.learning.spring.aop.aspectj.pointcut.expression.annotation.LogEntity)")
    public void targetAnnotation() {
        System.out.println("Hello @target Function");
    }

    /**
     * 1. 函数 @within(A)：匹配任意标注了注解 @A 的目标类以及子孙类
     * 2. 【注意】如果是接口标注了 @A，实现接口的子类不匹配
     */
    @Before("@within(com.learning.spring.aop.aspectj.pointcut.expression.annotation.LogEntity)")
    public void withinAnnotation() {
        System.out.println("Hello @within Function");
    }

    /**
     * 1. 函数 target：针对目标类。通过判断目标类是否按类型匹配指定类来决定连接点是否匹配
     * target(C): 表示如果目标类按类型匹配 C，则目标类的所有方法都匹配切点
     * <p>
     * 2. 例子
     * target(com.learning.spring.aop.aspectj.AopService): AopService 接口其子类的所有方法匹配，包括私有方法（目标类属于 AopService 类型）
     */
    @Before("target(com.learning.spring.aop.aspectj.pointcut.expression.service.impl.AopServiceImpl)")
    public void target() {
        System.out.println("Hello target Function");
    }

}
